﻿/**
 *
 * @file   FITKCCXAdaptorSet.h
 * @brief  Calculix part适配器，用于解析abaqus的inp文件中的set集合
 * @author XuChao (xxu715737@163.com)
 * @date   2024-05-27
 *
 */
#ifndef FITKCCXADAPTORSET_H
#define FITKCCXADAPTORSET_H

#include "FITKCCXAbstractAdaptor.h"
#include "FITKCCXModelInforManager.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

//前置声明
ForwardDeclarNS(Interface, FITKModelSet)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(AbaqusData, FITKAbaqusPart)
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(AbaqusData, FITKAbaqusPartManager)

namespace IO
{
    class FITKCCXAdaptorSet : public FITKCCXAbstractAdaptor
    {
    public:
        explicit FITKCCXAdaptorSet() = default;
        ~FITKCCXAdaptorSet() = default;

        /**
         * @brief  获取适配器数据类型名
         * @return 适配器数据类型名
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        QString getAdaptorClass() override;

        /**
         * @brief  设置算例数据对象
         * @param  caseData
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief  适配器读取
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        bool adaptR() override;

        /**
         * @brief  适配器写出
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        bool adaptW() override;

        /**
         * @brief 设置Assembly管理器和part管理器
         * @param ass Assembly管理器
         * @param part part管理器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-28
         */
        void setAssemblyPartManager(Interface::FITKAbaAssembly* ass, AbaqusData::FITKAbaqusPartManager* part);

        /**
         * @brief  设置Assembly管理器
         * @param  ass
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        void setAssemblyManager(Interface::FITKAbaAssembly* ass);

        /**
         * @brief  设置abaqus与calculix中的映射关系
         * @param  modelInfoManager
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setModelInfoManager(FITKCCXModelInforManager* modelInfoManager);

        /**
         * @brief  设置映射表键中的父节点objectDataID
         * @param  objectDataID
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setMappingKeyObjectDataID(const int &objectDataID);

        /**
         * @brief  设置集合累加器的值
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setSetNumber(const int &setNumber);

        /**
         * @brief  返回集合累加器的值
         * @return int 累加器结果值
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        int getSetNumber();

    private:
        /**
         * @brief  写出set
         * @param  set
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-28
         */
        bool writeSet(Interface::FITKModelSet* set);

        /**
         * @brief  根据abaqus节点的主键信息，查找节点的映射值
         * @param  isGenerateSet    是否是自增类型
         * @param  nodeIndex        节点的索引
         * @param  Index            循环索引
         * @param  isElSet          是否是elset
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        int getNodeMappingValue(const bool &isGenerateSet, const int &nodeIndex, const int &Index, const bool &isElSet);

        /**
         * @brief  根据instance的名称获取Instance的ID值
         * @param  inputInstanceName  instance的名称
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        int getInstanceIDByName(const QString &inputInstanceName);

    private:
        /**
         * @brief  算例数据
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief  集合（Set）数据  NSet\ElSet
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        Interface::FITKModelSet* _setData{};

        /**
         * @brief Assembly管理器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */

        Interface::FITKAbaAssembly* _assemblyManager{};
        /**s
         * @brief part管理器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        AbaqusData::FITKAbaqusPartManager* _partManager{};

        /**
         * @brief  abaqus与calculix映射关系表
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        FITKCCXModelInforManager *_modelInfoManager{};

        /**
         * @brief  集合编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _setNumber = 0;

        /**
         * @brief  映射表键的父节点
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _mappingKeyParentID = 0;

    };
    Register2FITKIOAdaptorFactory(CCXINP, Interface::FITKModelSet, FITKCCXAdaptorSet);
}
#endif // !FITKCCXADAPTORSET_H